"""
轮播图管理API路由
演示完整的CRUD操作（创建、读取、更新、删除）
"""
from typing import List
from fastapi import APIRouter, Depends, HTTPException, status, Query
from sqlalchemy.orm import Session
from sqlalchemy import desc

from ..database import get_db
from ..models.banner import Banner
from ..models.user import User
from ..schemas.banner import BannerCreate, BannerUpdate, BannerResponse, BannerListResponse
from ..dependencies import get_current_active_user


router = APIRouter(prefix="/api/banners", tags=["轮播图管理"])


@router.get("", response_model=BannerListResponse, summary="获取轮播图列表")
async def get_banners(
    page: int = Query(1, ge=1, description="页码"),
    size: int = Query(10, ge=1, le=100, description="每页数量"),
    active_only: bool = Query(False, description="只显示激活的轮播图"),
    db: Session = Depends(get_db)
):
    """
    获取轮播图列表，支持分页和筛选

    这个接口演示了：
    1. 查询参数验证：使用Query()定义参数约束
    2. 数据库查询：使用SQLAlchemy ORM
    3. 分页处理：计算偏移量和总页数
    4. 条件筛选：根据参数动态构建查询条件
    """
    # 构建查询
    query = db.query(Banner)

    # 如果只显示激活的轮播图
    if active_only:
        query = query.filter(Banner.is_active == True)

    # 按排序顺序排列
    query = query.order_by(Banner.sort_order, desc(Banner.created_at))

    # 计算总数
    total = query.count()

    # 分页
    offset = (page - 1) * size
    items = query.offset(offset).limit(size).all()

    # 计算总页数
    pages = (total + size - 1) // size

    return BannerListResponse(
        items=items,
        total=total,
        page=page,
        size=size,
        pages=pages
    )


@router.get("/{banner_id}", response_model=BannerResponse, summary="获取轮播图详情")
async def get_banner(
    banner_id: int,
    db: Session = Depends(get_db)
):
    """
    根据ID获取轮播图详情

    Args:
        banner_id: 轮播图ID
        db: 数据库会话

    Returns:
        BannerResponse: 轮播图详情

    Raises:
        HTTPException: 轮播图不存在时返回404错误
    """
    banner = db.query(Banner).filter(Banner.id == banner_id).first()

    if not banner:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="轮播图不存在"
        )

    return banner


@router.post("", response_model=BannerResponse, summary="创建轮播图")
async def create_banner(
    banner_data: BannerCreate,
    current_user: User = Depends(get_current_active_user),
    db: Session = Depends(get_db)
):
    """
    创建新的轮播图

    需要管理员权限

    Args:
        banner_data: 轮播图数据
        current_user: 当前用户（需要认证）
        db: 数据库会话

    Returns:
        BannerResponse: 创建的轮播图信息
    """
    # 创建轮播图对象
    db_banner = Banner(**banner_data.dict())

    # 保存到数据库
    db.add(db_banner)
    db.commit()
    db.refresh(db_banner)

    return db_banner


@router.put("/{banner_id}", response_model=BannerResponse, summary="更新轮播图")
async def update_banner(
    banner_id: int,
    banner_data: BannerUpdate,
    current_user: User = Depends(get_current_active_user),
    db: Session = Depends(get_db)
):
    """
    更新轮播图信息

    需要管理员权限

    Args:
        banner_id: 轮播图ID
        banner_data: 更新的轮播图数据
        current_user: 当前用户（需要认证）
        db: 数据库会话

    Returns:
        BannerResponse: 更新后的轮播图信息

    Raises:
        HTTPException: 轮播图不存在时返回404错误
    """
    # 查找轮播图
    db_banner = db.query(Banner).filter(Banner.id == banner_id).first()

    if not db_banner:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="轮播图不存在"
        )

    # 更新字段（只更新提供的字段）
    update_data = banner_data.dict(exclude_unset=True)
    for field, value in update_data.items():
        setattr(db_banner, field, value)

    # 保存更改
    db.commit()
    db.refresh(db_banner)

    return db_banner


@router.delete("/{banner_id}", summary="删除轮播图")
async def delete_banner(
    banner_id: int,
    current_user: User = Depends(get_current_active_user),
    db: Session = Depends(get_db)
):
    """
    删除轮播图

    需要管理员权限

    Args:
        banner_id: 轮播图ID
        current_user: 当前用户（需要认证）
        db: 数据库会话

    Returns:
        dict: 删除成功消息

    Raises:
        HTTPException: 轮播图不存在时返回404错误
    """
    # 查找轮播图
    db_banner = db.query(Banner).filter(Banner.id == banner_id).first()

    if not db_banner:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="轮播图不存在"
        )

    # 删除轮播图
    db.delete(db_banner)
    db.commit()

    return {"message": "轮播图删除成功"}